package chapter7_取消关闭.响应中断;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * 响应中断
 */
public class InterruptExceptionSnippet {
    private final LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();

    /**
     * 传递中断异常
     *
     * @return
     * @throws InterruptedException
     */
    public Integer getNextTask() throws InterruptedException {
        return queue.take();
    }

    public Integer getNextTask(int arg) {
        boolean interrupted = false;
        try {
            while (true) {
                try {
                    return queue.take();
                } catch (InterruptedException e) {
                    interrupted = true;
                    // 重新尝试,这里不能通过Thread.currentThread().interrupt()设置中断，因为阻塞方法（这里为take）会检测中断标志位
                }
            }
        } finally {
            if (interrupted) {
                // 设置中断标志位
                Thread.currentThread().interrupt();
            }
        }
    }


    public static void main(String[] args) throws InterruptedException {
//        // 演示阻塞方法会检测中断标志位
//        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
//        queue.add(5);
//        queue.add(3);
//        queue.take();
//        // 此处设置中断标志位
//        Thread.currentThread().interrupt();
//        System.out.println("asdfasdf");
//        queue.add(123);
//        //此处打断点，在阻塞方法执行前会检测中断标志位
//        queue.take();


        // 演示非阻塞方法不会检测中断标志位
        // 此处设置中断标志位
        Thread.currentThread().interrupt();
        while (true) {
            LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
            queue.add(5);
            queue.add(3);
            System.out.println("添加元素");
            // 阻塞方法，会检测中断标志位
//            Thread.sleep(5);
            // 主动检测中断标志位，并实现逻辑处理
//            System.out.println(Thread.currentThread().isInterrupted());
            queue.add(123);
        }
    }
}
